package com.changwu.cwbase.AppTest.DesignPattern;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by changwu on 2018/10/14.
 */
public class ObserverDesign {
    /**
     *  抽象观察者类，为所有具体观察者定义一个接口，在得到通知时更新自己
     */
    public interface Observer {
        /**
         *  有更新
         *
         *  @param message 消息
         */
        public void update(String message);

    }
    /**
     * 抽象被观察者类
     */
    public interface Observable {

        /**
         * 推送消息
         *
         * @param message 内容
         */
        void push(String message);

        /**
         * 订阅
         *
         * @param observer 订阅者
         */
        void register(Observer observer);
    }
    /**
     * 具体的观察者类，也就是订阅者
     */
    public static class User implements Observer {

        @Override
        public void update(String message) {
            System.out.println(name + "," + message + "更新了！");

        }

        // 订阅者的名字
        private String name;

        public User(String name) {
            this.name = name;
        }
    }
    /**
     *  具体的被观察者类，也就是订阅的节目
     */
    public static class Teleplay implements Observable{

        private List<Observer> list = new ArrayList<Observer>();//储存订阅者

        @Override
        public void push(String message) {
            for(Observer observer:list){
                observer.update(message);
            }
        }

        @Override
        public void register(Observer observer) {
            list.add(observer);
        }

    }
    public  void testObserverDesign(){
        //被观察者，这里就是用户订阅的电视剧
        Teleplay teleplay = new Teleplay();
        //观察者，这里就是订阅用户
        User user1 = new User("小明");
        User user2 = new User("小光");
        User user3 = new User("小兰");
        //订阅
        teleplay.register(user1);
        teleplay.register(user2);
        teleplay.register(user3);
        //推送新消息
        teleplay.push("xxx电视剧");
    }
}
